﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;

using ChatClient.metier;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using Chat.remoting;
using System.Runtime.Remoting;
using System.Configuration;
using System.IO;
using System.Threading;

namespace ChatClient
{
    static class Program
    {
        private static IProtocole manager = null; 

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            log("Chargement de la configuration ...");    
            Configuration.load();
            log("Chargement du remoting ...");
            Manager.getInstance();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Client());
        }

        /// <summary>
        /// Cette fonction permet de logguer les erreurs côté client dans
        /// le fichier définit dans la configuration.
        /// L'heure sera aussi ajouté devant chaque message.
        /// </summary>
        /// <param name="message">Le message à logguer</param>
        /// <returns></returns>
        static bool log(string message)
        {
            string path = ConfigurationManager.AppSettings["logPath"];
            if (!path.Equals(String.Empty))
            {
                try
                {
                    FileStream s = new FileStream(path, FileMode.OpenOrCreate);
                    return write(s, path, message);
                }
                catch (Exception e)
                {
                    return false;
                }
            }
            return false;
        }

        /// <summary>
        /// Cette fonctionne écrit des messages dans le filestream ouvert 
        /// et le ferme.
        /// </summary>
        /// <param name="s">FileStream</param>
        /// <param name="path">Le path du fichier de log</param>
        /// <param name="message">Le message à logger.</param>
        /// <returns></returns>
        static bool write(FileStream s, string path, string message)
        {
            try
            {
                if (s.CanWrite)
                {
                    // le using ferme le flux.           
                    using (StreamWriter sw = new StreamWriter(s))
                    {
                        sw.WriteLine(DateTime.Now + " : " + message);
                        return true;
                    }
                }
            }
            catch (Exception e)
            {
                // exception si le fichier est deja ouvert ailleurs par exemple
                return false;
            }
            finally
            {
                if (!s.Equals(null))
                    s.Close();
            }

            return false;
        }

    }
}